package com.ckjw.gobang.connect;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.HashMap;
import java.util.Properties;

import javax.swing.JOptionPane;

import com.ckjw.gobang.data.GameCenter;
import com.ckjw.gobang.data.Player;
import com.ckjw.gobang.data.Spot;
import com.ckjw.gobang.data.TableData;
import com.ckjw.gobang.utils.Coordinate;
import com.ckjw.gobang.utils.Path;
import com.ckjw.gobang.utils.randomtool;
import com.ckjw.gobang.view.ChessBroad;
import com.ckjw.gobang.view.MainInterface;
import com.ckjw.gobang.view.UserPanel2;

/**
 * 完成创建socket并验证用户登陆和注册等功能
 * 
 * @author lck and djw
 * @Date 2022年6月13日-上午10:27:36
 */
public class UserClientService {
	// 因为我们可能在其他地方用使用user信息, 因此作出成员属性
	private User u = new User();
	static Socket socket;
	// 创建 HashMap 对象 onlineusers接收在线用户
	public static HashMap<String, String> onlineusers = new HashMap<>();
	// 需要时开启
	public static ClientConnectServerThread clientConnectServerThread;
	//服务器ip，端口号
	String ip,port;

	/**
	 * 根据userId 和 pwd 到服务器验证该用户是否合法，登陆判断
	 * 
	 * @param userId
	 * @param pwd
	 * @return
	 */
	public boolean checkUser(String userId, String pwd) {
		boolean b = false;
		// 创建User对象
		u.setUserId(userId);
		u.setPasswd(pwd);
		try {
			//读取配置文件
			readsetfile();
			// 连接到服务端，发送u对象
			socket = new Socket(ip,Integer.parseInt(port));
			ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
			oos.writeObject(u);// 发送User对象
			// 读取从服务器回复的Message对象
			ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
			Message ms = (Message) ois.readObject();
			if (ms.getMesType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)) {// 登录OK
				Player.onlineuser = u;
				// onlineFriendList();
				// 创建一个和服务器端保持通信的线程-> 创建一个类 ClientConnectServerThread
				clientConnectServerThread = new ClientConnectServerThread(socket);
				// 启动客户端的线程
				clientConnectServerThread.start();
				// 返回真登陆成功
				b = true;
			} else {
				// 如果登录失败, 我们就不能启动和服务器通信的线程, 关闭socket
				socket.close();
			}

		} catch (Exception e) {
			e.printStackTrace();

		}
		return b;
	}

	/**
	 * 注册功能
	 * 
	 * @param id
	 * @param name
	 * @param pwd
	 * @return true 成功，false 失败
	 */
	public boolean regist(String id, String name, String pwd) {
		boolean result = false;
		// 将信息装到对象user
		u.setName(name);
		u.setUserId(id);
		u.setPasswd(pwd);
		try {
			//读取配置文件
			readsetfile();
			// 发送给服务器
			socket = new Socket(ip, Integer.parseInt(port));
			ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
			oos.writeObject(u);
			// 接受服务器的注册结果
			ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
			Message message1 = (Message) ois.readObject();
			String res = message1.getContent();
			// 判断是否成功
			if (res.equals("true")) {
				result = true;
				System.out.println("注册成功");
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (socket != null) {
				try {
					socket.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return result;
	}

	/**
	 * 编写方法，退出客户端，并给服务端发送一个退出系统的message对象
	 */
	public void logout() {
		Message message = new Message();
		message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);
		message.setSender(u.getUserId());// 指定我是哪个客户端id

		// 发送message
		try {
			ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
			oos.writeObject(message);
			System.out.println(Player.onlineuser.getUserId() + " 退出系统 ");
			System.exit(0);// 结束进程
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 发送游戏请求
	 */
	public static void onlineGame() {

		// 创造信息，将选定用户id封装发送，类型为game
		Message message = new Message();
		message.setMesType(MessageType.MESSAGE_GAME);
		message.setGetter(UserPanel2.selectUsertx.getId());
		// 生成随机数判断那个用户先下棋
		int a = randomtool.randomarea(0, 1);// 0挑战者先下
		if (a == 0) {
			ChessBroad.firstdown = true;
		}
		message.setContent(a + "");

		try {
			ObjectOutputStream oos;
			oos = new ObjectOutputStream(socket.getOutputStream());
			oos.writeObject(message); // 发送一个Message对象，向服务端转发游戏请求

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 根据棋子位置绘制棋子
	 */
	public static void startgame(Spot spot, int col, int row) {
		
		TableData.putDownChess(spot);// 这个函数里面也有判断游戏是否结束。
		// 标记为最后一个棋子
		ChessBroad.lastx = Coordinate.colToX(col);// 列传进去获得x坐标
		ChessBroad.lasty = Coordinate.rowToY(row);// 行传进去获得y坐标
		ChessBroad.myBroad2.repaint();
		// 创造信息，将棋子位置发送给对战用户
		Message message = new Message();
		message.setMesType(MessageType.MESSAGE_COMM_MES);
		message.setGetter(Player.onlinepkUser.getUserId());
		String content = ChessBroad.lastx + "\n" + ChessBroad.lasty + "\n" + spot.getRow() + "\n" + spot.getCol()
				+ "\n";
		message.setContent(content);

		try {
			ObjectOutputStream oos;
			oos = new ObjectOutputStream(socket.getOutputStream());
			oos.writeObject(message); // 发送一个Message对象，向服务端转发游戏数据
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		// 检查游戏是否结束
		if (TableData.isOver()) {
			ChessBroad.aferWin();
		}
	}
	/**
	 * 发送投降信息
	 */
	public static  void setover()
	{
		Message message = new Message();;
		message.setMesType(MessageType.MESSAGE_GAMEOVER);
		message.setGetter(Player.onlinepkUser.getUserId());
		ObjectOutputStream oos;
		try {
			oos = new ObjectOutputStream(socket.getOutputStream());
			oos.writeObject(message); // 发送一个Message对象，向服务端转发游戏数据
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 读取配置文件信息
	 */
	public void readsetfile() {
		String path=new Path().getPath()+"/seeting.properties";
		//System.out.println(path);
		Properties pros = new Properties();
		try {
			InputStream is = new FileInputStream(path);
			pros.load(is);
			ip=pros.getProperty("ip");
			port=pros.getProperty("port");
			System.out.println("读到的ip是\t"+ip);
			System.out.println("读到的端口号是\t"+port);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("配置文件加载出错，需要和jar包同级目录或src的一级目录下");
		}
	}
}
